/*
 * The contents of this file are subject to the Mozilla Public License
 * Version 1.1 (the "License");  you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * http//www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
 * the specific language governing rights and limitations under the License.
 *
 * The Original Code is ART OWL API.
 *
 * The Initial Developer of the Original Code is University of Roma Tor Vergata.
 * Portions created by University of Roma Tor Vergata are Copyright (C) 2009.
 * All Rights Reserved.
 *
 * The ART OWL API were developed by the Artificial Intelligence Research Group
 * (art.uniroma2.it) at the University of Roma Tor Vergata
 * Current information about the ART OWL API can be obtained at 
 * http://art.uniroma2.it/owlart
 *
 */

package it.uniroma2.art.owlart.utilities;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import it.uniroma2.art.owlart.exceptions.ModelAccessException;
import it.uniroma2.art.owlart.io.RDFNodeSerializer;
import it.uniroma2.art.owlart.model.ARTBNode;
import it.uniroma2.art.owlart.model.ARTNode;
import it.uniroma2.art.owlart.model.ARTURIResource;
import it.uniroma2.art.owlart.models.OWLModel;
import it.uniroma2.art.owlart.models.RDFModel;
import it.uniroma2.art.owlart.navigation.ARTLiteralIterator;

/**
 * this is used to show a node in a human friendly way which is most appropriate for its nature (uri, bnode or
 * literal) and role in the dataset
 * 
 * @author Armando Stellato
 * 
 */
public class RDFRenderer {

	protected static Logger logger = LoggerFactory.getLogger(RDFRenderer.class);
	
	public static String renderRDFNode(RDFModel model, ARTURIResource resource) throws ModelAccessException {
		return model.getQName(resource.getURI());
	}

	// only dataRange is rendered at the moment
	public static String renderRDFNode(RDFModel model, ARTBNode node) throws ModelAccessException {
		if (model instanceof OWLModel) {
			OWLModel owlModel = (OWLModel) model;
			if (owlModel.isDataRange(node)) {
				logger.trace("rendering owl:Datarange for node: " + node);
				ARTLiteralIterator it = owlModel.parseDataRange(node);
				StringBuffer buffy;
				if (!it.streamOpen())
					buffy = new StringBuffer("{ }");
				else {
					buffy = new StringBuffer("{" + renderRDFNode(model, it.getNext()));
					while (it.streamOpen()) {
						buffy.append(", " + renderRDFNode(model, it.getNext()));
					}
					buffy.append("}");
				}
				it.close();
				return buffy.toString();
			}
		}

		return RDFNodeSerializer.toNT(node);

	}

	/**
	 * rendering for purposes of showing the node content to the user. This maybe
	 * 
	 * @param model
	 * @param node
	 * @return
	 * @throws ModelAccessException
	 */
	public static String renderRDFNode(RDFModel model, ARTNode node) throws ModelAccessException {
		if (node.isURIResource())
			return renderRDFNode(model, node.asURIResource());
		if (node.isBlank())
			return renderRDFNode(model, node.asBNode());
		else
			return node.asLiteral().getLabel(); // Literal
	}

}
